package DataStructure.tree;

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;

/**
 * 102. 二叉树的层序遍历 https://leetcode.cn/problems/binary-tree-level-order-traversal
 * 题目简述：给你二叉树的根节点root，返回其每一层的节点值序列。也是广度优先遍历（BFS）
 */
public class LevelOrder {

    /**
     * 思路：队列。在一次循环中，先记录队列中的元素数，然后按数量将队列中所有元素出队，每出队一个元素，则将其孩子节点入队
     * 这样在每一次循环中，都出队一层元素，并入队下一层元素。循环结束条件即为队列为空，即最后一层元素已全部出队，下一层没有元素。
     */
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> result = new ArrayList<>();
        if(root == null) return result;
        Queue<TreeNode> queue = new ArrayDeque<>();
        queue.add(root);
        while(!queue.isEmpty()) {
            List<Integer> oneLevel = new ArrayList<>();
            int size = queue.size();
            for(int i=1;i <= size;i++) {
                TreeNode node = queue.remove();
                oneLevel.add(node.val);
                if(node.left != null) queue.add(node.left);
                if(node.right != null) queue.add(node.right);
            }
            result.add(oneLevel);
        }
        return result;
    }
}
